<html>
    <head>
        <title>分页、排序列表结果  （接口、基类）</title>
    </head>
    <body>
        <script>
            /*
                3、分页 & 排序 列表结果  Paged & Sorted List Results

                                                       从服务器请求分页列表并将分页列表返回给客户端更常见。ABP定义了一些接口和类来标准化它：

                                                       （1）、请求的输入类型  Input Type for Request

                                                                    以下接口和类用于标准化客户端发送的输入：

                                                                        ①、ILimitedResultRequest：定义MaxResultCount（int）属性以从服务器请求有限的结果。

                                                                        ②、IPagedResultRequest：从ILimitedResultRequest继承（因此它固有地具有MaxResultCount属性）
                                                                        
                                                                                                并定义一个SkipCount（int）来声明跳过计数，同时从服务器请求分页结果。

                                                                        ③、ISortedResultRequest：定义一个Sorting（string）属性，用于从服务器请求排序结果。
                                                                        
                                                                                                排序值可以是“Name”、“Name DESC”、“Name ASC， age DESC”…等等。

                                                                        ④、IPagedAndSortedResultRequest

                                                                                                    继承自IPagedResultRequest和ISortedResultRequest，
                                                                                                    
                                                                                                    因此具有MaxResultCount、SkipCount和Sorting属性。


                                                                        ★、 建议不要手动实现接口，而是继承以下基本DTO类之一：

                                                                            ①、LimitedResultRequestDto实现ILimitedResultRequest。

                                                                            ②、PagedResultRequestDto实现IPagedResultRequest（并继承自LimitedResultRequestDto）。

                                                                            ③、PagedAndSortedResultRequestDto实现IPagedAndSortedResultRequest（并继承自PagedResultRequestDto）。


                                                                         ★、最大结果数量  Max Result Count 

                                                                                LimitedResultRequestDto（以及固有的其他）通过以下规则限制和验证MaxResultCount：

                                                                                    ①、如果客户端未设置MaxResultCount，则假定为10（默认页面大小）。
                                                                                    
                                                                                            可以通过设置LimitedResultRequestDto.DefaultMaxResultCount "静态属性"。

                                                                                            如果客户端发送MaxResultCount大于1,000，则会产生验证错误。保护服务器免受服务滥用非常重要。

                                                                                            如果需要，可以通过设置LimitedResultRequestDto.MaxMaxResultCount静态属性来更改此值。


                                                                                        建议在应用程序启动时设置静态属性，因为它们是静态的（全局的）。

                                                    (2)、输出类型  Output Type for Response

                                                                以下接口和类用于标准化发送给客户端的输出:

                                                                      ①、IHasTotalCount定义了一个TotalCount（long）属性，用于在分页的情况下返回记录的总计数。

                                                                      ②、IPagedResult<T>继承自IListResult<T>和IHasTotalCount，因此它具有Items和TotalCount属性。


                                                                建议不要手动实现接口，而是继承以下基本DTO类之一：

                                                                      ①、PagedResultDto<T>继承自ListResultDto<T>，还实现了IPagedResult<T>。
                                                                

                                                                eg ：从服务器请求分页和排序的结果并返回分页列表

                                                                        using System;
                                                                        using System.Collections.Generic;
                                                                        using System.Linq;
                                                                        using System.Linq.Dynamic.Core;
                                                                        using System.Threading.Tasks;
                                                                        using Microsoft.EntityFrameworkCore;
                                                                        using Volo.Abp.Application.Dtos;
                                                                        using Volo.Abp.Application.Services;
                                                                        using Volo.Abp.Domain.Repositories;

                                                                        namespace AbpDemo
                                                                        {
                                                                            public class ProductAppService : ApplicationService, IProductAppService
                                                                            {
                                                                                private readonly IRepository<Product, Guid> _productRepository;

                                                                                public ProductAppService(IRepository<Product, Guid> productRepository)
                                                                                {
                                                                                    _productRepository = productRepository;
                                                                                }

                                                                                // 获取分页和排序列表  返回分页排序列表结果类型
                                                                                public async Task<PagedResultDto<ProductDto>> GetListAsync(
                                                                                    PagedAndSortedResultRequestDto input)
                                                                                {
                                                                                    // 创建查询
                                                                                    var query = _productRepository
                                                                                        .OrderBy(input.Sorting);

                                                                                    // 查询总记录数
                                                                                    var totalCount = await query.CountAsync();
                                                                                    
                                                                                    // 获取实体列表
                                                                                    List<Product> products = await query                
                                                                                        .Skip(input.SkipCount)
                                                                                        .Take(input.MaxResultCount).ToListAsync();

                                                                                    // 列表进行对象映射成DTO
                                                                                    List<ProductDto> productDtos =
                                                                                        ObjectMapper.Map<List<Product>, List<ProductDto>>(products);

                                                                                    // 返回分页排序列表结果
                                                                                    return new PagedResultDto<ProductDto>(totalCount, productDtos);
                                                                                }
                                                                            }
                                                                        }


                                                     ABP还定义了一个PageBy扩展方法（与IPagedResultRequest兼容），可以用来代替Skip+Take调用：

                                                                var query = _productRepository
                                                                                            .OrderBy(input.Sorting)
                                                                                            .PageBy(input);
                                                                        

                                                    备注：

                                                            请注意，我们将 "Volo.Abp.EntityFrameworkCore" NuGet包添加到项目中，
                                                            
                                                            以便能够使用ToListAsync和CountAsync方法，因为它们不包含在标准LINQ中，而是由Entity Framework Core定义。
            */
        </script>
    </body>
</html>